package com.example.cloudcity.dao;

import com.example.cloudcity.model.User; // 导入User模型类
import com.example.cloudcity.utils.DataSourceUtils; // 导入数据源工具类
import org.apache.commons.dbutils.QueryRunner; // 导入QueryRunner类，用于简化数据库操作
import org.apache.commons.dbutils.handlers.BeanHandler; // 导入BeanHandler类，用于将结果集映射为Java对象
import org.slf4j.Logger; // 导入Logger接口，用于日志记录
import org.slf4j.LoggerFactory; // 导入LoggerFactory类，用于创建Logger实例

import java.sql.Connection; // 导入Connection接口，用于数据库连接
import java.sql.PreparedStatement; // 导入PreparedStatement接口，用于执行预编译SQL语句
import java.sql.SQLException; // 导入SQLException类，用于处理SQL异常

public class UserDao {
    private static final QueryRunner queryRunner = new QueryRunner(DataSourceUtils.getDataSource()); // 创建QueryRunner实例
    private static final Logger logger = LoggerFactory.getLogger(UserDao.class); // 创建Logger实例

    // 根据字段和密码查询用户
    private User selectByField(String field, String value, String password) throws SQLException {
        String sql = "SELECT * FROM gamesuser WHERE " + field + " = ? AND password = ?"; // SQL查询语句
        logger.info("Executing query: {} with parameters: {}, {}", sql, value, password); // 记录查询信息
        return queryRunner.query(sql, new BeanHandler<>(User.class), value, password); // 执行查询并返回User对象
    }

    // 根据用户名和密码查询用户
    public User selectByUsername(String username, String password) throws SQLException {
        return selectByField("username", username, password); // 调用selectByField方法
    }

    // 根据电子邮件和密码查询用户
    public User selectByEmailPassword(String email, String password) throws SQLException {
        return selectByField("email", email, password); // 调用selectByField方法
    }

    // 用户登录方法
    public User login(String usernameOrEmail, String password) {
        User user = null; // 初始化用户对象
        try {
            user = selectByUsername(usernameOrEmail, password); // 尝试通过用户名查询用户
        } catch (SQLException e) {
            logger.error("Failed to select user by username: {}", e.getMessage(), e); // 记录错误日志
            return null; // 返回null表示查询失败
        }

        if (user != null) { // 如果找到用户
            logger.info("User found by username: {}", user); // 记录找到用户的信息
            return user; // 返回用户对象
        }

        try {
            user = selectByEmailPassword(usernameOrEmail, password); // 尝试通过电子邮件查询用户
        } catch (SQLException e) {
            logger.error("Failed to select user by email: {}", e.getMessage(), e); // 记录错误日志
            return null; // 返回null表示查询失败
        }

        if (user != null) { // 如果找到用户
            logger.info("User found by email: {}", user); // 记录找到用户的信息
        }

        return user; // 返回用户对象（可能为null）
    }

    // 注册用户方法
    public void registerUser(User user) throws SQLException {
        // 数据验证
        if (user == null || user.getUsername() == null || user.getPassword() == null || user.getEmail() == null) {
            throw new IllegalArgumentException("用户信息不完整"); // 抛出异常表示用户信息不完整
        }

        try (Connection conn = DataSourceUtils.getConnection(); // 获取数据库连接
             PreparedStatement pstmt = conn.prepareStatement(
                     "INSERT INTO users (username, password, email, mobile, isadmin) VALUES (?, ?, ?, ?, ?)")) { // SQL插入语句

            // 设置SQL语句中的参数
            pstmt.setString(1, user.getUsername());
            pstmt.setString(2, user.getPassword());
            pstmt.setString(3, user.getEmail());
            pstmt.setString(4, user.getMobile());
            pstmt.setString(5, user.getIsadmin());

            int rowsAffected = pstmt.executeUpdate(); // 执行插入操作
            if (rowsAffected <= 0) { // 如果没有插入成功
                throw new SQLException("注册失败，数据库插入失败"); // 抛出异常
            }
        } catch (SQLException e) {
            logger.error("Failed to register user: {}", e.getMessage(), e); // 记录错误日志
            throw e; // 抛出异常
        }
    }
}
